<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
    </head>
</html>
<script type="text/javascript">
    //1、var和let声明的变量在全局作用域中被定义时，被let声明的变量不会作为全局对象window的属性
    let a = 'aaa';
    var b = 'bbb';
    alert(window.a); //undefined
    alert(window.b); //'able'

    //2、var和let在函数作用域中声明一个变量，两个变量的意义是相同的
    function  f(){
        let a = 'aaa'; // 函数作用域中的变量
        var b = 'bbb'; // 函数作用域中的变量
        alert(a + b);
    }
    f();

    //3、在块作用域中两者的区别较为明显，let只在for()循环中可用，而var是对于包围for循环的整个函数可用
    function f1() {
        for (var i=0; i<3; i++) {

        }
        alert("var i = " + i);
    }
    function f2() {
        for (let i=0; i<3; i++) {

        }
        // alert("let i = " + i); //Uncaught ReferenceError: i
    }
    f1();f2();

    function f3() {
        for (var i=0; i<3; i++) { //var和let切换看下输出的不同
            setTimeout(function () { //异步
                console.log("setTimeout体内的i = " + i); //3秒后var输出：3，3，3 let输出：0，1，2
            }, 3000);
            console.log("setTimeout体外的i = " + i); //立即输出：0，1，2
        }
    }
    f3();

    //4、let不能重复声明，var可以重复声明
    let aa = "aaa";
    // let aa = "bbb"; //Identifier 'aa' has already been declared
    var bb = "aaa";
    var bb = "bbb"; //bb重新声明并赋值了

    //5、const定义常量，必须初始化值且不能修改
    // const c; //报错，Missing initializer in const declaration
    // const cc = 3;
    // cc = 5; //报错，Uncaught TypeError: Assignment to constant variable.
</script>
